// Copyright 2011-2012, Vanya Davidenko.
// Используемая кодировка: UTF-8.

#ifndef LIBV_BOOST_XML_SELECT_NODES_H_
#define LIBV_BOOST_XML_SELECT_NODES_H_

#include <utility>
#include <libv/boost/xml/filter_node_iterator.h>
#include <libv/boost/xml/xml_node.h>



namespace libv {

// Метод возвращает пару итераторов, обходящих всех непосредственных детей node,
// удовлетворяющих предикату pred.
template<class TTagPred>
::std::pair<FilterNodeIterator<XmlNode::Iterator, TTagPred>,
            FilterNodeIterator<XmlNode::Iterator, TTagPred> >
SelectNodes(const XmlNode& node, const TTagPred& pred) {
    return ::std::make_pair(
        MakeFilterNodeIterator(node.ChildrenBegin(), pred),
        MakeFilterNodeIterator(node.ChildrenEnd(), pred));
}


// TODO: Отделить версию с deep limit и без.
// Метод возвращает пару итераторов, обходящих всех потомков
// узла node, удовлетворяющих предикату pred.
template<class TTagPred>
::std::pair<FilterNodeIterator<DepthFirstXmlNodeIterator<TTagPred>,
                               TTagPred>,
            FilterNodeIterator<DepthFirstXmlNodeIterator<TTagPred>,
                               TTagPred> >
DeepSelectNodes(const XmlNode& node, const TTagPred& pred) {
    typedef DepthFirstXmlNodeIterator<TTagPred> DepthIterator;
    return ::std::make_pair(
        MakeFilterNodeIterator(DepthIterator(node, pred), pred),
        MakeFilterNodeIterator(DepthIterator(), pred));
}

}  // libv

#endif  // LIBV_BOOST_XML_SELECT_NODES_H_
